home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / earcd / text / misc / nroff.lha / nroff / main.c < prev    next >
C/C++ Source or Header  |  1997-01-24  |  20KB  |  994 lines

  1. #include "config.h"
  2.  
  3. /*
  4.  *    main.c - main for nroff word processor
  5.  *
  6.  *    similar to Unix(tm) nroff or RSX-11M RNO. adaptation of text processor
  7.  *    given in "Software Tools", Kernighan and Plauger.
  8.  *
  9.  *    adapted for atariST/TOS by Bill Rosenkranz 11/89
  10.  *    net:    rosenkra@hall.cray.com
  11.  *    CIS:    71460,17
  12.  *    GENIE:    W.ROSENKRANZ
  13.  *
  14.  *    original author:
  15.  *
  16.  *    Stephen L. Browning
  17.  *    5723 North Parker Avenue
  18.  *    Indianapolis, Indiana 46220
  19.  *
  20.  *    history:
  21.  *
  22.  *    - Originally written in BDS C;
  23.  *    - Adapted for standard C by W. N. Paul
  24.  *    - Heavily hacked up to conform to "real" nroff by Bill Rosenkranz
  25.  */
  26.  
  27. #define NRO_MAIN            /* to define globals in nro.h */
  28.  
  29. #include <stdio.h>
  30. #ifdef GEMDOS
  31. #include <sys\types.h>
  32. #include <sys\time.h>
  33. #else
  34. #include <sys/types.h>
  35. #include <sys/time.h>
  36. #endif
  37. #include "nroff.h"
  38.  
  39.  
  40. main (argc, argv)
  41. int     argc;
  42. char   *argv[];
  43. {
  44.     register int    i;
  45.     int        swflg;
  46.     int        ifp = 0;
  47.     char           *ptmp;
  48. #ifndef GEMDOS
  49.     char           *pterm;
  50.     char        capability[100];
  51.     char           *pcap;
  52.     char           *ps;
  53. #endif
  54.  
  55.  
  56.  
  57.     /*
  58.      *   set up initial flags and file descriptors
  59.      */
  60.     swflg       = FALSE;
  61.     ignoring    = FALSE;
  62.     hold_screen = FALSE;
  63.     debugging   = FALSE;
  64.     stepping    = FALSE;
  65.     mc_ing      = FALSE;
  66.     out_stream  = stdout;
  67.     err_stream  = stderr;
  68.     dbg_stream  = stderr;
  69.  
  70.  
  71.     /*
  72.      *   this is for tmp files, if ever needed. it SHOULD start
  73.      *   out without the trailing slash. if not in env, use default
  74.      */
  75.     if (ptmp = getenv ("TMPDIR"))
  76.         strcpy (tmpdir, ptmp);
  77.     else
  78.         strcpy (tmpdir, ".");
  79.  
  80.  
  81.     /*
  82.      *   handle terminal for \fB, \fI
  83.      */
  84. #ifdef GEMDOS
  85.     strcpy (s_standout, "\33p");        /* atari/TOS is easy... */
  86.     strcpy (e_standout, "\33q");
  87.     strcpy (s_bold, "\33p");        /* atari/TOS is easy... */
  88.     strcpy (e_bold, "\33q");
  89.     strcpy (s_italic, "\33p");
  90.     strcpy (e_italic, "\33q");
  91. #else
  92.     s_standout[0] = '\0';
  93.     e_standout[0] = '\0';
  94.     s_bold[0]     = '\0';
  95.     e_bold[0]     = '\0';
  96.     s_italic[0]   = '\0';
  97.     e_italic[0]   = '\0';
  98.     if (pterm = getenv ("TERM"))        /* it must exist first... */
  99.     {
  100.         /*
  101.          *   we currently use standout mode for all weirdness
  102.          *   lile BOLD, italic, etc.
  103.          */
  104.         pcap = capability;
  105.         if (ps = "\\E[7m") /*sorry had to hard code these for damn linux*/
  106.         {
  107.             /*
  108.              *   sun has padding in here. this is NOT portable.
  109.              *   better to use tputs() to strip it...
  110.              */
  111.             while (*ps && *ps != 0x1b)    ps++;
  112.             strcpy (s_standout, ps);
  113.             strcpy (s_bold, ps);
  114.             strcpy (s_italic, ps);
  115.         }
  116.         if (ps = "\\E[m")
  117.         {
  118.             while (*ps && *ps != 0x1b)    ps++;
  119.             strcpy (e_standout, ps);
  120.             strcpy (e_bold, ps);
  121.             strcpy (e_italic, ps);
  122.         }
  123.     }
  124. #endif
  125.  
  126.  
  127.  
  128.     /*
  129.      *   initialize structures (defaults)
  130.      */
  131.     init ();
  132.  
  133.  
  134.     /*
  135.      *   parse cmdline flags
  136.      */
  137.     for (i = 1; i < argc; ++i)
  138.     {
  139.         if (*argv[i] == '-' || *argv[i] == '+')
  140.         {
  141.             if (pswitch (argv[i], &swflg) == ERR)
  142.                 err_exit (-1);
  143.         }
  144.     }
  145.  
  146.  
  147.     /*
  148.      *   loop on files
  149.      */
  150.     for (i = 1; i < argc; ++i)
  151.     {
  152.         if (*argv[i] != '-' && *argv[i] != '+')
  153.         {
  154.             /*
  155.              *   open this file...
  156.              */
  157.             if ((sofile[0] = fopen (argv[i], "r")) == NULL_FPTR)
  158.             {
  159.                 fprintf (err_stream,
  160.                     "***%s: unable to open file %s\n",
  161.                     myname, argv[i]);
  162.                 err_exit (-1);
  163.             }
  164.             else
  165.             {
  166.                 /*
  167.                  *   do it for this file...
  168.                  */
  169.                 ifp = 1;
  170.                 profile ();
  171.                 fclose (sofile[0]);
  172.             }
  173.         }
  174.         else if (*argv[i] == '-' && *(argv[i]+1) == 0)
  175.         {
  176.             /*
  177.              *   - means read stdin (anywhere in file list)
  178.              */
  179.             sofile[0] = stdin;
  180.             ifp = 1;
  181.             profile ();
  182.         }
  183.  
  184.     }
  185.  
  186.  
  187.     /*
  188.      *   if no files, usage (should really use stdin...)
  189.      */
  190.     if ((ifp == 0 && swflg == FALSE) || argc <= 1)
  191.     {
  192.         usage ();
  193.  
  194.         err_exit (-1);
  195.     }
  196.  
  197.  
  198.     /*
  199.      *   normal exit. this will fflush/fclose streams...
  200.      */
  201.     err_exit (0);
  202. }
  203.  
  204.  
  205.  
  206.  
  207. /*------------------------------*/
  208. /*    usage            */
  209. /*------------------------------*/
  210. usage ()
  211. {
  212.     /*
  213.      *   note: -l may not work correctly
  214.      */
  215.     fprintf (stderr, "Usage:   %s [options] file [...]\n", myname);
  216.     fprintf (stderr, "Options: -a        no font changes\n");
  217.     fprintf (stderr, "         -b        backspace\n");
  218.     fprintf (stderr, "         -d        debug mode (file: nroff.dbg)\n");
  219. #ifdef GEMDOS
  220.     fprintf (stderr, "         -h        hold screen before desktop\n");
  221. #endif
  222. /*!!!    fprintf (stderr, "         -l        output to printer\n");*/
  223.     fprintf (stderr, "         -m<name>  macro file (e.g. -man)\n");
  224.     fprintf (stderr, "         -o<file>  error log file (stderr is default)\n");
  225.     fprintf (stderr, "         -po<n>    page offset\n");
  226.     fprintf (stderr, "         -pn<n>    initial page number\n");
  227.     fprintf (stderr, "         -pl<n>    page length\n");
  228.     fprintf (stderr, "         -s        step through pages\n");
  229.     fprintf (stderr, "         -v        print version only\n");
  230.     fprintf (stderr, "         +<n>      first page to do\n");
  231.     fprintf (stderr, "         -<n>      last page to do\n");
  232.     fprintf (stderr, "         -         use stdin (in file list)\n");
  233. }
  234.  
  235.  
  236.  
  237.  
  238. /*------------------------------*/
  239. /*    init            */
  240. /*------------------------------*/
  241. init ()
  242. {
  243.  
  244. /*
  245.  *    initialize parameters for nro word processor
  246.  */
  247.  
  248.     extern long    time ();
  249.  
  250. #ifdef MINIX
  251.     register int    i;
  252. #else
  253.     register long    i;
  254. #endif
  255.     time_t        tval;
  256.     char           *ctim;
  257.  
  258.     /*
  259.      *   misc global flags, etc...
  260.      */
  261.     mc_space   = 2;
  262.     mc_char    = '|';
  263.     tval       = time (0L);
  264.     ctim       = ctime (&tval);
  265.  
  266.     /*
  267.      *   basic document controls...
  268.      */
  269.     dc.fill    = YES;
  270.     dc.dofnt   = YES;
  271.     dc.lsval   = 1;
  272.     dc.inval   = 0;
  273.     dc.rmval   = PAGEWIDTH - 1;
  274.     dc.llval   = PAGEWIDTH - 1;
  275.     dc.ltval   = PAGEWIDTH - 1;
  276.     dc.tival   = 0;
  277.     dc.ceval   = 0;
  278.     dc.ulval   = 0;
  279.     dc.cuval   = 0;
  280.     dc.juval   = YES;
  281.     dc.adjval  = ADJ_BOTH;
  282.     dc.boval   = 0;
  283.     dc.bsflg   = FALSE;
  284.     dc.prflg   = TRUE;
  285.     dc.sprdir  = 0;
  286.     dc.flevel  = 0;
  287.     dc.lastfnt = 1;
  288.     dc.thisfnt = 1;
  289.     dc.escon   = YES;
  290.     dc.pgchr   = '%';
  291.     dc.cmdchr  = '.';
  292.     dc.escchr  = '\\';
  293.     dc.nobrchr  = '\'';
  294.     for (i = 0; i < 26; ++i)
  295.         dc.nr[i] = 0;
  296.     for (i = 0; i < 26; ++i)
  297.         dc.nrauto[i] = 1;
  298.     for (i = 0; i < 26; ++i)
  299.         dc.nrfmt[i] = '1';
  300.  
  301.  
  302.     /*
  303.      *   initialize internal regs. first zero out...
  304.      */
  305.     for (i = 0; i < MAXREGS; i++)
  306.     {
  307.         rg[i].rname[0] = EOS;
  308.         rg[i].rname[1] = EOS;
  309.         rg[i].rname[2] = EOS;
  310.         rg[i].rname[3] = EOS;
  311.         rg[i].rauto = 1;
  312.         rg[i].rval  = 0;
  313.         rg[i].rflag = RF_READ;
  314.         rg[i].rfmt  = '1';
  315.     }
  316.  
  317.  
  318.     /*
  319.      *   predefined regs. these are read/write:
  320.      */
  321.     i = 0;
  322.  
  323.     strcpy (rg[i].rname, "%");        /* current page */
  324.     rg[i].rauto = 1;
  325.     rg[i].rval  = 0;
  326.     rg[i].rflag = RF_READ | RF_WRITE;
  327.     rg[i].rfmt  = '1';
  328.     i++;
  329.     
  330.     strcpy (rg[i].rname, "ct");        /* character type */
  331.     rg[i].rauto = 1;
  332.     rg[i].rval  = 0;
  333.     rg[i].rflag = RF_READ | RF_WRITE;
  334.     rg[i].rfmt  = '1';
  335.     i++;
  336.     
  337.     strcpy (rg[i].rname, "dl");        /* width of last complete di */
  338.     rg[i].rauto = 1;
  339.     rg[i].rval  = 0;
  340.     rg[i].rflag = RF_READ | RF_WRITE;
  341.     rg[i].rfmt  = '1';
  342.     i++;
  343.     
  344.     strcpy (rg[i].rname, "dn");        /* height of last complete di */
  345.     rg[i].rauto = 1;
  346.     rg[i].rval  = 0;
  347.     rg[i].rflag = RF_READ | RF_WRITE;
  348.     rg[i].rfmt  = '1';
  349.     i++;
  350.     
  351.     strcpy (rg[i].rname, "dw");        /* day of week (1-7) */
  352.     rg[i].rval  = 0;
  353.     if      (!strncmp (&ctim[0], "Sun", 3))
  354.         rg[i].rval  = 1;
  355.     else if (!strncmp (&ctim[0], "Mon", 3))
  356.         rg[i].rval  = 2;
  357.     else if (!strncmp (&ctim[0], "Tue", 3))
  358.         rg[i].rval  = 3;
  359.     else if (!strncmp (&ctim[0], "Wed", 3))
  360.         rg[i].rval  = 4;
  361.     else if (!strncmp (&ctim[0], "Thu", 3))
  362.         rg[i].rval  = 5;
  363.     else if (!strncmp (&ctim[0], "Fri", 3))
  364.         rg[i].rval  = 6;
  365.     else if (!strncmp (&ctim[0], "Sat", 3))
  366.         rg[i].rval  = 7;
  367.     rg[i].rauto = 1;
  368.     rg[i].rflag = RF_READ | RF_WRITE;
  369.     rg[i].rfmt  = '1';
  370.     i++;
  371.     
  372.     strcpy (rg[i].rname, "dy");        /* day of month (1-31) */
  373.     rg[i].rauto = 1;
  374.     rg[i].rval  = atoi (&ctim[8]);
  375.     rg[i].rflag = RF_READ | RF_WRITE;
  376.     rg[i].rfmt  = '1';
  377.     i++;
  378.     
  379.     strcpy (rg[i].rname, "hp");        /* current h pos on input */
  380.     rg[i].rauto = 1;
  381.     rg[i].rval  = 0;
  382.     rg[i].rflag = RF_READ | RF_WRITE;
  383.     rg[i].rfmt  = '1';
  384.     i++;
  385.     
  386.     strcpy (rg[i].rname, "ln");        /* output line num */
  387.     rg[i].rauto = 1;
  388.     rg[i].rval  = 0;
  389.     rg[i].rflag = RF_READ | RF_WRITE;
  390.     rg[i].rfmt  = '1';
  391.     i++;
  392.     
  393.     strcpy (rg[i].rname, "mo");        /* current month (1-12) */
  394.     rg[i].rval  = 0;
  395.     if      (!strncmp (&ctim[4], "Jan", 3))
  396.         rg[i].rval  = 1;
  397.     else if (!strncmp (&ctim[4], "Feb", 3))
  398.         rg[i].rval  = 2;
  399.     else if (!strncmp (&ctim[4], "Mar", 3))
  400.         rg[i].rval  = 3;
  401.     else if (!strncmp (&ctim[4], "Apr", 3))
  402.         rg[i].rval  = 4;
  403.     else if (!strncmp (&ctim[4], "May", 3))
  404.         rg[i].rval  = 5;
  405.     else if (!strncmp (&ctim[4], "Jun", 3))
  406.         rg[i].rval  = 6;
  407.     else if (!strncmp (&ctim[4], "Jul", 3))
  408.         rg[i].rval  = 7;
  409.     else if (!strncmp (&ctim[4], "Aug", 3))
  410.         rg[i].rval  = 8;
  411.     else if (!strncmp (&ctim[4], "Sep", 3))
  412.         rg[i].rval  = 9;
  413.     else if (!strncmp (&ctim[4], "Oct", 3))
  414.         rg[i].rval  = 10;
  415.     else if (!strncmp (&ctim[4], "Nov", 3))
  416.         rg[i].rval  = 11;
  417.     else if (!strncmp (&ctim[4], "Dec", 3))
  418.         rg[i].rval  = 12;
  419.     rg[i].rauto = 1;
  420.     rg[i].rflag = RF_READ | RF_WRITE;
  421.     rg[i].rfmt  = '1';
  422.     i++;
  423.     
  424.     strcpy (rg[i].rname, "nl");        /* v pos of last base-line */
  425.     rg[i].rauto = 1;
  426.     rg[i].rval  = 0;
  427.     rg[i].rflag = RF_READ | RF_WRITE;
  428.     rg[i].rfmt  = '1';
  429.     i++;
  430.     
  431.     strcpy (rg[i].rname, "sb");        /* depth of str below base */
  432.     rg[i].rauto = 1;
  433.     rg[i].rval  = 0;
  434.     rg[i].rflag = RF_READ | RF_WRITE;
  435.     rg[i].rfmt  = '1';
  436.     i++;
  437.     
  438.     strcpy (rg[i].rname, "st");        /* height of str above base */
  439.     rg[i].rauto = 1;
  440.     rg[i].rval  = 0;
  441.     rg[i].rflag = RF_READ | RF_WRITE;
  442.     rg[i].rfmt  = '1';
  443.     i++;
  444.     
  445.     strcpy (rg[i].rname, "yr");        /* last 2 dig of current year*/
  446.     rg[i].rauto = 1;
  447.     rg[i].rval  = atoi (&ctim[22]);
  448.     rg[i].rflag = RF_READ | RF_WRITE;
  449.     rg[i].rfmt  = '1';
  450.     i++;
  451.     
  452.     strcpy (rg[i].rname, "hh");        /* current hour (0-23) */
  453.     rg[i].rauto = 1;
  454.     rg[i].rval  = atoi (&ctim[11]);
  455.     rg[i].rflag = RF_READ | RF_WRITE;
  456.     rg[i].rfmt  = 2 | 0x80;
  457.     i++;
  458.     
  459.     strcpy (rg[i].rname, "mm");        /* current minute (0-59) */
  460.     rg[i].rauto = 1;
  461.     rg[i].rval  = atoi (&ctim[14]);
  462.     rg[i].rflag = RF_READ | RF_WRITE;
  463.     rg[i].rfmt  = 2 | 0x80;
  464.     i++;
  465.     
  466.     strcpy (rg[i].rname, "ss");        /* current second (0-59) */
  467.     rg[i].rauto = 1;
  468.     rg[i].rval  = atoi (&ctim[17]);
  469.     rg[i].rflag = RF_READ | RF_WRITE;
  470.     rg[i].rfmt  = 2 | 0x80;
  471.     i++;
  472.     
  473.  
  474.     /*
  475.      *   these are read only (by user):
  476.      */
  477.     strcpy (rg[i].rname, ".$");        /* num args at current macro*/
  478.     rg[i].rauto = 1;
  479.     rg[i].rval  = 0;
  480.     rg[i].rflag = RF_READ;
  481.     rg[i].rfmt  = '1';
  482.     i++;
  483.     
  484.     strcpy (rg[i].rname, ".A");        /* 1 for nroff */
  485.     rg[i].rauto = 1;
  486.     rg[i].rval  = 1;
  487.     rg[i].rflag = RF_READ;
  488.     rg[i].rfmt  = '1';
  489.     i++;
  490.     
  491.     strcpy (rg[i].rname, ".H");        /* hor resolution */
  492.     rg[i].rauto = 1;
  493.     rg[i].rval  = 1;
  494.     rg[i].rflag = RF_READ;
  495.     rg[i].rfmt  = '1';
  496.     i++;
  497.     
  498.     strcpy (rg[i].rname, ".T");        /* 1 for troff */
  499.     rg[i].rauto = 0;
  500.     rg[i].rval  = 0;
  501.     rg[i].rflag = RF_READ;
  502.     rg[i].rfmt  = '1';
  503.     i++;
  504.     
  505.     strcpy (rg[i].rname, ".V");        /* vert resolution */
  506.     rg[i].rauto = 1;
  507.     rg[i].rval  = 1;
  508.     rg[i].rflag = RF_READ;
  509.     rg[i].rfmt  = '1';
  510.     i++;
  511.     
  512.     strcpy (rg[i].rname, ".a");
  513.     rg[i].rauto = 1;
  514.     rg[i].rval  = 0;
  515.     rg[i].rflag = RF_READ;
  516.     rg[i].rfmt  = '1';
  517.     i++;
  518.     
  519.     strcpy (rg[i].rname, ".c");
  520.     rg[i].rauto = 1;
  521.     rg[i].rval  = 0;
  522.     rg[i].rflag = RF_READ;
  523.     rg[i].rfmt  = '1';
  524.     i++;
  525.     
  526.     strcpy (rg[i].rname, ".d");
  527.     rg[i].rauto = 1;
  528.     rg[i].rval  = 0;
  529.     rg[i].rflag = RF_READ;
  530.     rg[i].rfmt  = '1';
  531.     i++;
  532.     
  533.     strcpy (rg[i].rname, ".f");        /* current font (1-4) */
  534.     rg[i].rauto = 1;
  535.     rg[i].rval  = 1;
  536.     rg[i].rflag = RF_READ;
  537.     rg[i].rfmt  = '1';
  538.     i++;
  539.     
  540.     strcpy (rg[i].rname, ".h");
  541.     rg[i].rauto = 1;
  542.     rg[i].rval  = 0;
  543.     rg[i].rflag = RF_READ;
  544.     rg[i].rfmt  = '1';
  545.     i++;
  546.     
  547.     strcpy (rg[i].rname, ".i");        /* current indent */
  548.     rg[i].rauto = 1;
  549.     rg[i].rval  = 0;
  550.     rg[i].rflag = RF_READ;
  551.     rg[i].rfmt  = '1';
  552.     i++;
  553.     
  554.     strcpy (rg[i].rname, ".l");        /* current line length */
  555.     rg[i].rauto = 1;
  556.     rg[i].rval  = PAGEWIDTH - 1;
  557.     rg[i].rflag = RF_READ;
  558.     rg[i].rfmt  = '1';
  559.     i++;
  560.     
  561.     strcpy (rg[i].rname, ".n");
  562.     rg[i].rauto = 1;
  563.     rg[i].rval  = 0;
  564.     rg[i].rflag = RF_READ;
  565.     rg[i].rfmt  = '1';
  566.     i++;
  567.     
  568.     strcpy (rg[i].rname, ".o");        /* current offset */
  569.     rg[i].rauto = 1;
  570.     rg[i].rval  = 0;
  571.     rg[i].rflag = RF_READ;
  572.     rg[i].rfmt  = '1';
  573.     i++;
  574.     
  575.     strcpy (rg[i].rname, ".p");        /* current page len */
  576.     rg[i].rauto = 1;
  577.     rg[i].rval  = PAGELEN;
  578.     rg[i].rflag = RF_READ;
  579.     rg[i].rfmt  = '1';
  580.     i++;
  581.     
  582.     strcpy (rg[i].rname, ".s");        /* current point size */
  583.     rg[i].rauto = 1;
  584.     rg[i].rval  = 1;
  585.     rg[i].rflag = RF_READ;
  586.     rg[i].rfmt  = '1';
  587.     i++;
  588.     
  589.     strcpy (rg[i].rname, ".t");
  590.     rg[i].rauto = 1;
  591.     rg[i].rval  = 0;
  592.     rg[i].rflag = RF_READ;
  593.     rg[i].rfmt  = '1';
  594.     i++;
  595.     
  596.     strcpy (rg[i].rname, ".u");
  597.     rg[i].rauto = 1;
  598.     rg[i].rval  = 0;
  599.     rg[i].rflag = RF_READ;
  600.     rg[i].rfmt  = '1';
  601.     i++;
  602.     
  603.     strcpy (rg[i].rname, ".v");        /* current v line spacing */
  604.     rg[i].rauto = 1;
  605.     rg[i].rval  = 1;
  606.     rg[i].rflag = RF_READ;
  607.     rg[i].rfmt  = '1';
  608.     i++;
  609.     
  610.     strcpy (rg[i].rname, ".w");        /* width of prev char */
  611.     rg[i].rauto = 1;
  612.     rg[i].rval  = 1;
  613.     rg[i].rflag = RF_READ;
  614.     rg[i].rfmt  = '1';
  615.     i++;
  616.     
  617.     strcpy (rg[i].rname, ".x");
  618.     rg[i].rauto = 1;
  619.     rg[i].rval  = 0;
  620.     rg[i].rflag = RF_READ;
  621.     rg[i].rfmt  = '1';
  622.     i++;
  623.     
  624.     strcpy (rg[i].rname, ".y");
  625.     rg[i].rauto = 1;
  626.     rg[i].rval  = 0;
  627.     rg[i].rflag = RF_READ;
  628.     rg[i].rfmt  = '1';
  629.     i++;
  630.     
  631.     strcpy (rg[i].rname, ".z");
  632.     rg[i].rauto = 1;
  633.     rg[i].rval  = 0;
  634.     rg[i].rflag = RF_READ;
  635.     rg[i].rfmt  = '1';
  636.  
  637.     /*
  638.      *   page controls...
  639.      */
  640.     pg.curpag   = 0;
  641.     pg.newpag   = 1;
  642.     pg.lineno   = 0;
  643.     pg.plval    = PAGELEN;
  644.     pg.m1val    = 2;
  645.     pg.m2val    = 2;
  646.     pg.m3val    = 2;
  647.     pg.m4val    = 2;
  648.     pg.bottom   = pg.plval - pg.m4val - pg.m3val;
  649.     pg.offset   = 0;
  650.     pg.frstpg   = 0;
  651.     pg.lastpg   = 30000;
  652.     pg.ehead[0] = pg.ohead[0] = '\n';
  653.     pg.efoot[0] = pg.ofoot[0] = '\n';
  654.     for (i = 1; i < MAXLINE; ++i)
  655.     {
  656.         pg.ehead[i] = pg.ohead[i] = EOS;
  657.         pg.efoot[i] = pg.ofoot[i] = EOS;
  658.     }
  659.     pg.ehlim[LEFT]  = pg.ohlim[LEFT]  = dc.inval;
  660.     pg.eflim[LEFT]  = pg.oflim[LEFT]  = dc.inval;
  661.     pg.ehlim[RIGHT] = pg.ohlim[RIGHT] = dc.rmval;
  662.     pg.eflim[RIGHT] = pg.oflim[RIGHT] = dc.rmval;
  663.  
  664.     /*
  665.      *   output buffer controls...
  666.      */
  667.     co.outp   = 0;
  668.     co.outw   = 0;
  669.     co.outwds = 0;
  670.     co.lpr    = FALSE;
  671.     co.outesc = 0;
  672.     for (i = 0; i < MAXLINE; ++i)
  673.         co.outbuf[i] = EOS;
  674.  
  675.     /*
  676.      *   macros...
  677.      */
  678.     for (i = 0; i < MXMDEF; ++i)
  679.         mac.mnames[i] = NULL_CPTR;
  680.     for (i = 0; i < MACBUF; ++i)
  681.         mac.mb[i] = EOS;
  682.     for (i = 0; i < MAXPBB; ++i)
  683.         mac.pbb[i] = EOS;
  684.     mac.lastp = 0;
  685.     mac.emb   = &mac.mb[0];
  686.     mac.ppb   = NULL_CPTR;
  687.  
  688.     /*
  689.      *   file descriptors (for sourced files)
  690.      */
  691.     for (i = 0; i < Nfiles+1; ++i)
  692.         sofile[i] = NULL_FPTR;
  693. }
  694.  
  695.  
  696.  
  697.  
  698. /*------------------------------*/
  699. /*    pswitch            */
  700. /*------------------------------*/
  701. pswitch (p, q)
  702. register char  *p;
  703. register int   *q;
  704. {
  705.  
  706. /*
  707.  *    process switch values from command line
  708.  */
  709.  
  710.     int     swgood;
  711.     char    mfile[256];
  712.     char   *ptmac;
  713.     int    indx;
  714.     int    val;
  715.  
  716.     swgood = TRUE;
  717.     if (*p == '-')
  718.     {
  719.         /*
  720.          *   since is STILL use the goofy atari/dri xmain code, i
  721.          *   look for both upper and lower case. if you use dLibs
  722.          *   (and if its startup code does not ucase the cmd line),
  723.          *   you can probably look for just lower case. gulam and
  724.          *   other shells typically don't change case of cmd line.
  725.          */
  726.         switch (*++p)
  727.         {
  728.         case 0:                    /* stdin */
  729.             break;
  730.  
  731.         case 'a':                 /* font changes */
  732.         case 'A': 
  733.             dc.dofnt = NO;
  734.             break;
  735.  
  736.         case 'b':                 /* backspace */
  737.         case 'B': 
  738.             dc.bsflg = TRUE;
  739.             break;
  740.  
  741.         case 'd':                 /* debug mode */
  742.         case 'D': 
  743.             dbg_stream = fopen (dbgfile, "w");
  744.             debugging  = TRUE;
  745.             if (dbg_stream == NULL_FPTR)
  746.             {
  747.                 fprintf (err_stream,
  748.                     "***%s: unable to open debug file %s\n",
  749.                     myname, dbgfile);
  750.  
  751.                 dbg_stream  = stderr;
  752.             }
  753.             break;
  754.  
  755.         case 'h':                 /* hold screen */
  756.         case 'H': 
  757.             hold_screen = TRUE;
  758.             break;
  759.  
  760.         case 'l':                 /* to lpr (was P) */
  761.         case 'L': 
  762. #ifdef GEMDOS
  763.             out_stream = (FILE *) 0;
  764. #else
  765.             out_stream = fopen (printer, "w");
  766. #endif
  767.             co.lpr = TRUE;
  768.             break;
  769.  
  770.         case 'm':                 /* macro file */
  771.         case 'M': 
  772.             /*
  773.              *   build macro file name. start with lib
  774.              *
  775.              *   put c:\lib\tmac in environment so we can
  776.              *   read it here. else use default. if you want
  777.              *   file from cwd, "setenv TMACDIR ." from shell.
  778.              *
  779.              *   we want file names like "tmac.an" (for -man)
  780.              */
  781.             if (ptmac = getenv ("TMACDIR"))
  782.             {
  783.                 /*
  784.                  *   this is the lib path (e.g. "c:\lib\tmac")
  785.                  */
  786.                 strcpy (mfile, ptmac);
  787.  
  788.                 /*
  789.                  *   this is the prefix (i.e. "\tmac.")
  790.                  */
  791.                 strcat (mfile, TMACPRE);
  792.             }
  793.             else
  794.                 /*
  795.                  *   use default lib/prefix (i.e.
  796.                  *   "c:\lib\tmac\tmac.")
  797.                  */
  798.                 strcpy (mfile, TMACFULL);
  799.  
  800.             /*
  801.              *   finally, add extension (e.g. "an")
  802.              */
  803.             strcat (mfile, ++p);
  804.  
  805.             /*
  806.              *   open file and read it
  807.              */
  808.             if ((sofile[0] = fopen (mfile, "r")) == NULL_FPTR)
  809.             {
  810.                 fprintf (stderr,
  811.                     "***%s: unable to open macro file %s\n",
  812.                     myname, mfile);
  813.                 err_exit (-1);
  814.             }
  815.             profile ();
  816.             fclose (sofile[0]);
  817.             break;
  818.  
  819.         case 'o':                 /* output error log */
  820.         case 'O': 
  821.             if (!*(p+1))
  822.             {
  823.                 fprintf (stderr,
  824.                     "***%s: no error file specified\n",
  825.                     myname);
  826.                 err_exit (-1);
  827.             }
  828.             if ((err_stream = fopen (p+1, "w")) == NULL_FPTR)
  829.             {
  830.                 fprintf (stderr,
  831.                     "***%s: unable to open error file %s\n",
  832.                     myname, p+1);
  833.                 err_exit (-1);
  834.             }
  835.             break;
  836.  
  837.         case 'p':                 /* .po, .pn */
  838.         case 'P':
  839.             if (*(p+1) == 'o' || *(p+1) == 'O')    /* -po___ */
  840.             {
  841.                 p += 2;
  842.                 set (&pg.offset, ctod (p), '1', 0, 0, HUGE);
  843.                 set_ireg (".o", pg.offset, 0);
  844.             }
  845.             else if (*(p+1) == 'n' || *(p+1) == 'N')/* -pn___ */
  846.             {
  847.                 p += 2;
  848.                 set (&pg.curpag, ctod (p) - 1, '1', 0, -HUGE, HUGE);
  849.                 pg.newpag = pg.curpag + 1;
  850.                 set_ireg ("%", pg.newpag, 0);
  851.             }
  852.             else if (*(p+1) == 'l' || *(p+1) == 'L')/* -pl___ */
  853.             {
  854.                 p += 2;
  855.                 set (&pg.plval, ctod (p) - 1, '1', 0,
  856.                     pg.m1val + pg.m2val + pg.m3val + pg.m4val + 1,
  857.                     HUGE);
  858.                 set_ireg (".p", pg.plval, 0);
  859.                 pg.bottom = pg.plval - pg.m3val - pg.m4val;
  860.             }
  861.             else                    /* -p___ */
  862.             {
  863.                 p++;
  864.                 set (&pg.offset, ctod (p), '1', 0, 0, HUGE);
  865.                 set_ireg (".o", pg.offset, 0);
  866.             }
  867.             break;
  868.  
  869.         case 'r':                /* set number reg */
  870.         case 'R':
  871.             if (!isalpha (*(p+1)))
  872.             {
  873.                 fprintf (stderr,
  874.                     "***%s: invalid number register name (%c)\n",
  875.                     myname, (int) *(p+1));
  876.             }
  877.             else
  878.             {
  879.                 /*
  880.                  *   indx is the user num register and val
  881.                  *   is the final value.
  882.                  */
  883.                 indx = tolower (*(p+1)) - 'a';
  884.                 val  = atoi (p+2);
  885.                 set (&dc.nr[indx], val, '1', 0, -INFINITE, INFINITE);
  886.             }
  887.             break;
  888.  
  889.         case 's':                 /* page step mode */
  890.         case 'S': 
  891.             stepping = TRUE;
  892.             break;
  893.  
  894.         case 'v':                 /* version */
  895.         case 'V': 
  896.             printf ("%s\n", version);
  897.             *q = TRUE;
  898.             break;
  899.  
  900.         case '0':                 /* last page */
  901.         case '1': 
  902.         case '2': 
  903.         case '3': 
  904.         case '4': 
  905.         case '5': 
  906.         case '6': 
  907.         case '7': 
  908.         case '8': 
  909.         case '9': 
  910.             pg.lastpg = ctod (p);
  911.             break;
  912.  
  913.         default:                 /* illegal */
  914.             swgood = FALSE;
  915.             break;
  916.         }
  917.     }
  918.     else if (*p == '+')                /* first page */
  919.     {
  920.         pg.frstpg = ctod (++p);
  921.     }
  922.     else                        /* illegal */
  923.     {
  924.         swgood = FALSE;
  925.     }
  926.  
  927.  
  928.     if (swgood == FALSE)
  929.     {
  930.         fprintf (stderr, "***%s: illegal switch %s\n", myname, p);
  931.         return (ERR);
  932.     }
  933.  
  934.     return (OK);
  935. }
  936.  
  937.  
  938.  
  939.  
  940. /*------------------------------*/
  941. /*    profile            */
  942. /*------------------------------*/
  943. profile ()
  944. {
  945.  
  946. /*
  947.  *    process input files from command line
  948.  */
  949.  
  950.     char    ibuf[MAXLINE];
  951.  
  952.     /*
  953.      *   handle nesting of includes (.so). note that .so causes dc.flevel
  954.      *   to be increased...
  955.      */
  956.     for (dc.flevel = 0; dc.flevel >= 0; dc.flevel -= 1)
  957.     {
  958.         while (getlin (ibuf, sofile[dc.flevel]) != EOF)
  959.         {
  960.             /*
  961.              *   if line is a command or text
  962.              */
  963.             if (ibuf[0] == dc.cmdchr)
  964.             {
  965.                 comand (ibuf);
  966.             }
  967.             else
  968.             {
  969.                 /*
  970.                  *   this is a text line. first see if
  971.                  *   first char is space. if it is, break
  972.                  *   line.
  973.                  */
  974.                 if (ibuf[0] == ' ')
  975.                     robrk ();
  976.                 text (ibuf);
  977.             }
  978.         }
  979.  
  980.         /*
  981.          *   close included file
  982.          */
  983.         if (dc.flevel > 0)
  984.             fclose (sofile[dc.flevel]);
  985.     }
  986.     if (pg.lineno > 0)
  987.         space (HUGE);
  988. }
  989.  
  990.  
  991.  
  992.  
  993.  
  994.